約 2,199,613 件
https://w.atwiki.jp/endgame/pages/6.html
このページでは、原著→日本語翻訳、もしくはウェブサイトの記事等で誤りがあると思われる記載について整理します。 ※二版以降、またはWebページなど、のちに修正される可能性があるので、記載情報は古くなっている場合があります。 ■アン・リューの血族番号 ウェブページの記載では「77番」とありますが、正しくは「377番」です。>日本語版での記載:「さ、さ、さ、さ、さんびゃく、な、な、な、ななじゅうなな番」>原著での記載:「A-A-An Liu. Three-three-three-three-three hundred seventy-seventy-seventy-seventy-seventy-seven」
https://w.atwiki.jp/ce00582/pages/5572.html
html head title 練習 /title /head body script type="text/javascript" var a; a=2; document.write(a); /script /body /html
https://w.atwiki.jp/iwannabethewiki/pages/4223.html
製作者 もさもさ DL先↓ https //www.axfc.net/u/3730274
https://w.atwiki.jp/0x0b/pages/100.html
Mozilla JavaScriptの続き Working with ArraysCreating an array Working with array elements Understanding length Iterating over arrays Array methods Working with Array-like objects Two-Dimensional Arrays Array comprehensions Iterators and GeneratorsIterators Defining custom iterators Generators a better way to build Iterators Advanced generators Generator expressions オブジェクトモデルの詳細クラスベース言語とプロトタイプベース言語 クラスの定義 サブクラスと継承 プロパティの追加と削除 違いの概要 従業員の例 階層の作成 オブジェクトのプロパティ プロパティの継承 プロパティの追加 より柔軟なコンストラクタ プロパティの継承、再び ローカル値と継承値 インスタンス関係の決定 コンストラクタにおけるグローバル情報 多重継承のようなもの Working with Arrays Creating an array Working with array elements Understanding length Iterating over arrays Array methods Working with Array-like objects Two-Dimensional Arrays Array comprehensions Iterators and Generators Iterators Defining custom iterators Generators a better way to build Iterators Advanced generators Generator expressions オブジェクトモデルの詳細 クラスベース言語とプロトタイプベース言語 Java や C++ といったクラスベースのオブジェクト指向言語はクラスとインスタンスという 2 つの異なる実体があるという概念に基づいています。 クラスはあるオブジェクトの集合を特徴付けるすべてのプロパティ(Java ではメソッドとフィールドを、C++ ではメンバをプロパティと見なす)を定義する。クラスとはそれが表すオブジェクトの集合の特定のメンバではなく、抽象的なものである。例えば、Employee クラスで従業員すべてを含む集合を表す。 一方、インスタンスはクラスを実例にしたものである。つまり、そのメンバの 1 つということである。例えば、Victoria は Employee クラスのインスタンスとなることができる。このクラスは特定の個人を従業者として表すものである。インスタンスはその親クラスのプロパティを正確に保持する(それに他ならない)。 JavaScript のようなプロトタイプベース言語はこの区別がありません。単にオブジェクトがあるだけです。プロトタイプベース言語には原型的なオブジェクトという概念があります。このオブジェクトは新しいオブジェクトの初期プロパティを取得する元になるテンプレートとして使用されます。どのオブジェクトもそれ独自のプロパティを指定できます。オブジェクト作成時にも実行時にも可能です。さらに、どのオブジェクトも別のオブジェクトに対するプロトタイプとして関連付けることができます。2 つ目のオブジェクトが 1 つ目のオブジェクトのプロトタイプを共有するということもできます。 クラスの定義 クラスベース言語ではクラス定義ごとにクラスを定義します。定義では特殊なメソッドを指定してそのクラスのインスタンスを作成することができます。そのようなメソッドはコンストラクタと呼びます。コンストラクタメソッドはインスタンスのプロパティに対する初期値を指定することができます。また、作成時に他の適当な処理を実行することもできます。new 演算子をコンストラクタメソッドと一緒に用いることでクラスのインスタンスを作成できます。 JavaScript は同様のモデルに従っていますが、コンストラクタと別になっているクラス定義がありません。その代わりに、プロパティと値からなる特定の初期的なセットを持つオブジェクトを作成するコンストラクタ関数を定義します。どの JavaScript 関数もコンストラクタとして使用できます。new 演算子をコンストラクタ関数とともに使用することで新しいオブジェクトを作成します。 サブクラスと継承 クラスベース言語ではクラス定義を通じてクラスの階層を作ります。クラス定義では新しいクラスがある既存のクラスのサブクラスになるように指定することができます。サブクラスはスーパークラスの全プロパティを継承します。さらに新しくプロパティを追加したり継承したものを変更することもできます。例えば、Employee クラスが name および dept プロパティのみを含んでおり、Manager は reports プロパティを追加する Employee のサブクラスであるとします。この場合、Manager クラスのインスタンスは name、dept、reports という 3 つのプロパティをすべて持つことになります。 JavaScript では、原型的なオブジェクトをどのコンストラクタ関数にも結びつけることができるようにして継承を実装しています。そのため、全く同じような Employee と Manager の例を作成することができますが、使用する用語が若干異なります。まず、Employee コンストラクタ関数を定義します。これは name および dept プロパティを指定します。次に Manager コンストラクタ関数を定義します。これは reports プロパティを指定します。最後に新しい Employee オブジェクトを Manager コンストラクタ関数に対するプロトタイプとして代入します。そして新しい Manager を作成すると、このオブジェクトは Employee オブジェクトから name および dept プロパティを継承します。 プロパティの追加と削除 クラスベース言語では一般的にクラスをコンパイル時に生成し、コンパイル時または実行時にクラスのインスタンスを作成します。クラス定義後にそのクラスのプロパティの数や型を変更することはできません。しかし、JavaScript ではどんなオブジェクトでも実行時にプロパティを追加したり削除したりすることができます。あるオブジェクトのセットでプロトタイプとして使用されているオブジェクトにプロパティを追加すると、そのプロトタイプの使用元であるオブジェクトにも新しいプロパティが追加されます。 違いの概要 次の表でこれらの違いをいくつか短くまとめてみます。この章の残りで、JavaScript のコンストラクタとプロトタイプを用いてオブジェクト階層を作成することについての詳細を説明していきます。また、この方法が Java ではどう変わるかという比較もします。 クラスベース (Java) プロトタイプベース (JavaScript) クラスとインスタンスは異なる実体である。 すべてのオブジェクトはインスタンスである。 クラス定義を用いてクラスを定義する。また、コンストラクタメソッドを用いてクラスをインスタンス化する。 コンストラクタ関数を用いてオブジェクトのセットを定義し、作成する。 new 演算子を用いて単一のオブジェクトを作成する。 同じ。 既存のクラスのサブクラスを定義するクラス定義を用いてオブジェクト階層を構築する。 コンストラクタ関数に結びつけられたプロトタイプとしてオブジェクトを代入することでオブジェクト階層を構築する。 クラスチェーンに従ってプロパティを継承する。 プロトタイプチェーンに従ってプロパティを継承する。 クラス定義がクラスの全インスタンスの全プロパティを指定する。実行時に動的にプロパティを追加することはできない。 コンストラクタ関数またはプロトタイプがプロパティの初期セットを指定する。個々のオブジェクトやオブジェクトの全体のセットに動的にプロパティを追加したり、それらからプロパティを除去したりできる。 従業員の例 この章の残りは次の図で示す従業員の階層を使用していきます。 これの例では以下のオブジェクトを使用しています。 Employee はプロパティ name(デフォルトの値は空文字列)および dept(デフォルトの値は "general")を持つ。 Manager は Employee をベースとしている。これは reports プロパティ(デフォルトの値は空の配列、その値として Employee オブジェクトの配列を持たせる)を追加する。 WorkerBee も Employee をベースとしている。これは projects プロパティ(デフォルトの値は空の配列、その値として文字列の配列を持たせる)を追加する。 SalesPerson は WorkerBee をベースとしている。これは quota プロパティ(デフォルトの値は 100)を追加する。さらに dept プロパティを "sales" という値で上書きする。これは販売員は全員同じ部署に所属していることを示す。 Engineer は WorkerBee をベースとしている。これは machine プロパティ(デフォルトの値は空文字列)を追加し、さらに dept プロパティを "engineering" という値で上書きする。 残りの例: 階層の作成 オブジェクトのプロパティプロパティの継承 プロパティの追加 より柔軟なコンストラクタ 階層の作成 Employee の階層を実装するための適当なコンストラクタ関数を定義する方法はいくつかあります。これの定義に何を選択するかは、アプリケーションで何ができるようにしたいかに大きくよります。 このセクションではとても単純(かつ比較的柔軟でない)定義の使用方法を示し、継承を機能させる方法を実際に示します。これらの定義では、オブジェクト作成時に何らかのプロパティの値を指定することはできません。新しく作成されるオブジェクトは単にデフォルトの値を取得するだけです。これは後から変更できます。図 8.2 ではこれらの単純な定義を備えた階層を例示します。 実際のアプリケーションでは、オブジェクト作成時にプロパティの値を設定できるようにするコンストラクタを定義することになるでしょう(詳しくは より柔軟なコンストラクタ を参照)。今回はこれらの単純な定義を使用して、継承はどのようにして起こるのかを実際に示していくことにします。 Employee オブジェクトの定義 以下に示すように、Java と JavaScript の Employee の定義は似ています。唯一の相違点は、Java では各プロパティに対して型を指定する必要があるのに対して、JavaScript ではその必要がないことです。また、Java のクラスでは明示的なコンストラクタメソッドを作成する必要があります。 JavaScriptJava function Employee () { this.name = ""; this.dept = "general"; } public class Employee { public String name; public String dept; public Employee () { this.name = ""; this.dept = "general"; } } Manager および WorkerBee の定義では、継承の連鎖において上である次のオブジェクトの指定方法に違いがあります。JavaScript では原型的なインスタンスをコンストラクタ関数の prototype プロパティとして追加します。コンストラクタを定義した後ならいつでもそれをすることができます。Java ではクラス定義内でスーパークラスを指定します。クラス定義の外部でスーパークラスを変更することはできません。 JavaScriptJava function Manager () { this.reports = []; } Manager.prototype = new Employee; function WorkerBee () { this.projects = []; } WorkerBee.prototype = new Employee; public class Manager extends Employee { public Employee[] reports; public Manager () { this.reports = new Employee[0]; } } public class WorkerBee extends Employee { public String[] projects; public WorkerBee () { this.projects = new String[0]; } } Engineer および SalesPerson の定義は、WorkerBee の子孫、それゆえに Employee の子孫であるオブジェクトを作成します。これらの種類のオブジェクトは連鎖において上にある全オブジェクトのプロパティを持ちます。さらに、これらの定義は dept プロパティの継承された値をこれらのオブジェクト固有の新しい値で上書きします。 JavaScriptJava function SalesPerson () { this.dept = "sales"; this.quota = 100; } SalesPerson.prototype = new WorkerBee; function Engineer () { this.dept = "engineering"; this.machine = ""; } Engineer.prototype = new WorkerBee; public class SalesPerson extends WorkerBee { public double quota; public SalesPerson () { this.dept = "sales"; this.quota = 100.0; } } public class Engineer extends WorkerBee { public String machine; public Engineer () { this.dept = "engineering"; this.machine = ""; } } これらの定義を使用して、そのプロパティのデフォルト値を取得するこれらのオブジェクトのインスタンスを作成することができます。図 8.3 ではこれらの JavaScript の定義を使用して新しいオブジェクトを作成する方法を示しています。また、新しいオブジェクトに対するプロパティの値も示しています。 注意:インスタンスという用語はクラスベース言語においてはある特定の技術的な意味を持っています。これらの言語では、インスタンスとはクラスの個々のメンバであり、クラスとは根本的に異なるものです。JavaScript では「インスタンス」はこの技術的な意味を持っていません。なぜならば JavaScript にはクラスとインスタンスとの間のこの違いがないからです。しかしながら、JavaScript について話す際に、「インスタンス」をある特定のコンストラクタ関数を用いて作成したオブジェクトを意味する言葉として正式ではない形で使用することがあります。例えば、jane は Engineer のインスタンスであると砕けた言い方をすることもできます。同様に、親、子、祖先、そして子孫という用語は JavaScript において正式な意味を持ちませんが、プロトタイプチェーンにおいて上や下にあるオブジェクトについて言及する際にそれらを正式ではない形で使用してもかまいません。 図:単純な定義を用いたオブジェクトの作成 オブジェクトのプロパティ このセクションでは、プロトタイプチェーンにおいてオブジェクトが他のオブジェクトからどのようにプロパティを継承するのか、また、実行時にプロパティを追加すると何が起きるのかについて論じます。 プロパティの継承 プロパティの追加 プロパティの継承 次の文を用いて(階層の作成 で示したように)mark オブジェクトを WorkerBee として作成するとします。 mark = new WorkerBee; JavaScript は new 演算子に出くわすと、新しく汎用オブジェクトを生成し、この新しいオブジェクトを this キーワードの値として WorkerBee コンストラクタ関数に渡します。コンストラクタ関数は明示的に projects プロパティの値をセットします。さらに、内部的な __proto__ プロパティの値として WorkerBee.prototype の値をセットします。(このプロパティ名は最初と最後に 2 文字ずつのアンダースコアが付いています。)__proto__ プロパティはプロパティの値を返すのに使用されるプロトタイプチェーンを決定します。これらのプロパティがセットされると JavaScript は新しいオブジェクトを返し、代入文は変数 mark にそのオブジェクトをセットします。 このプロセスでは mark がプロトタイプチェーンから継承するプロパティとして明示的には mark オブジェクトに値(ローカルの値)を格納しません。プロパティの値を使用するとき、JavaScript はまずその値がそのオブジェクトに存在しているかどうかを確認します。存在している場合はその値が返されます。値がローカルには存在していない場合、JavaScript はプロトタイプチェーンを確認します(__proto__ プロパティを使用)。プロトタイプチェーン内のオブジェクトがそのプロパティの値を持っている場合、その値が返されます。そのようなプロパティが見つからない場合は JavaScript はそのオブジェクトにはそのプロパティがないと報告します。このようにして、mark オブジェクトには次のようなプロパティと値が入ることになります。 mark.name = ""; mark.dept = "general"; mark.projects = []; mark オブジェクトは mark.__proto__ の原型的なオブジェクトから name および dept プロパティの値を継承します。WorkerBee コンストラクタによって projects プロパティにローカルの値が代入されます。このことでプロパティとその値を継承することができます。このプロセスの細かいところは プロパティの継承、再び にて議論します。 これらのコンストラクタにインスタンス固有の値を渡せないため、この情報は汎用的になります。プロパティの値は WorkerBee によって作成されるすべての新しいオブジェクトに共有される、デフォルトの値になります。もちろん、これらのどのプロパティのでもその値を変えることができます。そのためには次のようにして mark に固有の情報を与えます。 mark.name = "Doe, Mark"; mark.dept = "admin"; mark.projects = ["navigator"]; プロパティの追加 JavaScript では実行時にどんなオブジェクトにもプロパティを追加することができます。コンストラクタ関数で与えられるプロパティだけを使う必要はありません。ある 1 つのオブジェクト固有のプロパティを追加するには、次のようにしてオブジェクトに値を代入します。 mark.bonus = 3000; すると、mark オブジェクトには bonus プロパティができます。しかし、他のどの WorkerBee にもこのプロパティは存在しません。 あるコンストラクタ関数に対するプロトタイプとして使用されているオブジェクトに新しいプロパティを追加する場合、プロトタイプからプロパティを継承する全オブジェクトへそのプロパティを追加することになります。例えば、次の文を使用すると specialty プロパティをすべての従業員に対して追加することができます。 Employee.prototype.specialty = "none"; JavaScript がこの文を実行するとすぐに mark オブジェクトも "none" という値を持つ specialty プロパティを持つようになります。次の図ではこのプロパティを Employee プロトタイプに追加し、さらに Engineer プロトタイプに対するそれを上書きしたときの効果を示します。 図 :プロパティの追加 より柔軟なコンストラクタ これまでに見てきたコンストラクタ関数はインスタンス作成時にプロパティの値を指定することができませんでした。Java でのようにコンストラクタに引数を与えてインスタンスのプロパティの値を初期化することができます。次の図でそれを実現する 1 つの方法を示します。 図:コンストラクタでのプロパティの指定、その 1 次の表では Java および JavaScript でのこれらのオブジェクトの定義を示します。 JavaScriptJava function Employee (name, dept) { this.name = name || ""; this.dept = dept || "general"; } public class Employee { public String name; public String dept; public Employee () { this("", "general"); } public Employee (String name) { this(name, "general"); } public Employee (String name, String dept) { this.name = name; this.dept = dept; } } function WorkerBee (projs) { this.projects = projs || []; } WorkerBee.prototype = new Employee; public class WorkerBee extends Employee { public String[] projects; public WorkerBee () { this(new String[0]); } public WorkerBee (String[] projs) { this.projects = projs; } } function Engineer (mach) { this.dept = "engineering"; this.machine = mach || ""; } Engineer.prototype = new WorkerBee; public class Engineer extends WorkerBee { public String machine; public WorkerBee () { this.dept = "engineering"; this.machine = ""; } public WorkerBee (String mach) { this.dept = "engineering"; this.machine = mach; } } これらの JavaScript の定義ではデフォルト値をセットするのに特殊なイディオムを使用しています。 this.name = name || ""; JavaScript の論理 OR 演算子 (||) はその最初の引数を評価します。その引数が true に変換できる場合、演算子はそれを返します。そうでない場合は第 2 の引数の値を返します。したがって、このコードは name が name プロパティに使用できる値であるかをテストします。そうであれば this.name にその値をセットします。そうでなければ this.name に空文字列をセットします。簡単のため、この章ではこのイディオムを使用します。しかしながら、一目見ただけでは不可解に思えるかもしれません。これは数値や真偽値の引数では期待どおりに動作しない可能性がありますので注意してください。これは 0(ゼロ)でも false でもデフォルト値が選択されるようになるからです。そのため、この場合では以下のより煩わしいイディオムを使用する必要が出てきます。このイディオムはすべてのデータ型で望みどおりに動作します。 this.authorized = typeof(authorized) !== undefined ? authorized true; これらの定義を用いると、オブジェクトのインスタンスを作成するときに局所的に定義されたプロパティに対する値を指定することができます。図 8.5 で示したように、次の文を使用すると新しい Engineer を作成できます。 jane = new Engineer("belau"); すると Jane のプロパティは次のようになります。 jane.name == ""; jane.dept == "engineering"; jane.projects == []; jane.machine == "belau" これらの定義を用いると name のような継承されたプロパティに対する初期値を指定することはできないので気をつけてください。JavaScript の継承されたプロパティに対する初期値を指定したいのであれば、コンストラクタ関数にさらにコードを追加する必要があります。 これまではコンストラクタ関数は汎用オブジェクトを生成し、その後に新しいオブジェクトに対するローカルプロパティと値を定義していました。プロトタイプチェーンにおいて上位のオブジェクトに対するコンストラクタ関数を直接呼び出すことで、コンストラクタにさらにプロパティを追加させることができます。次の図ではこれらの新しい定義を示します。 図 :コンストラクタでのプロパティの指定、その 2 これらの定義の 1 つを詳しく見ていきましょう。これは Engineer コンストラクタの新しい定義です。 function Engineer (name, projs, mach) { this.base = WorkerBee; this.base(name, "engineering", projs); this.machine = mach || ""; } 次のようにして新しい Engineer オブジェクトを作成するとします。 jane = new Engineer("Doe, Jane", ["navigator", "javascript"], "belau"); JavaScript は次のステップに従います。 1.new 演算子が汎用オブジェクトを生成し、その __proto__ プロパティに Engineer.prototype をセットする。 2.new 演算子が Engineer コンストラクタに新しいオブジェクトを this キーワードの値として渡す。 3.コンストラクタがそのオブジェクトに対する base という新しいプロパティを生成し、WorkerBee コンストラクタの値を base プロパティ代入する。このことで WorkerBee コンストラクタは Engineer オブジェクトのメソッドとなる。 base というプロパティ名は特殊なものではありません。正当なプロパティ名であれば何でも使用できます。base は単にその意図をイメージさせるのに十分だからです。 4.コンストラクタが base メソッドを呼び出す。その引数として、コンストラクタに渡された引数のうちの 2 つ("Doe, Jane" および ["navigator", "javascript"])とさらに "engineering" という文字列を渡す。コンストラクタで "engineering" を明示的に使用することで、すべての Engineer オブジェクトが継承された dept プロパティに対して同じ値を持つようにし、この値が Employee から継承した値を上書きするようになる。 5.base は Engineer のメソッドであるため、base の呼び出し元の内部では JavaScript は this キーワードをステップ 1 で作成したオブジェクトに結びつける。したがって、WorkerBee 関数は順に "Doe, Jane" および ["navigator", "javascript"] という引数を Employee コンストラクタ関数に渡す。Employee コンストラクタ関数から戻ると、WorkerBee 関数は残りの引数を使用して projects プロパティをセットする。 6.base メソッドから戻ると、Engineer コンストラクタがオブジェクトの machine プロパティを "belau" で初期化する。 7.コンストラクタから戻ると、JavaScript は新しいオブジェクトを jane という変数に代入する。 Engineer コンストラクタの内部から WorkerBee コンストラクタを呼び出すと、Engineer オブジェクトに対して適切に継承をセットアップしたことになるのではないかと思うかもしれません。実際にはそうではありません。WorkerBee コンストラクタを呼び出すことで、呼び出された全コンストラクタ関数で指定されているプロパティを持った Engineer オブジェクトができるのが確実になります。しかし、後からプロパティを Employee または WorkerBee プロトタイプに追加する場合、そういったプロパティは Engineer オブジェクトに継承されません。例えば、次の文があるとします。 function Engineer (name, projs, mach) { this.base = WorkerBee; this.base(name, "engineering", projs); this.machine = mach || ""; } jane = new Engineer("Doe, Jane", ["navigator", "javascript"], "belau"); Employee.prototype.specialty = "none"; jane オブジェクトは specialty プロパティを継承しません。動的な継承を確実にするにはやはりプロトタイプを明示的にセットアップする必要があります。代わりに次の文を使用するとします。 function Engineer (name, projs, mach) { this.base = WorkerBee; this.base(name, "engineering", projs); this.machine = mach || ""; } Engineer.prototype = new WorkerBee; jane = new Engineer("Doe, Jane", ["navigator", "javascript"], "belau"); Employee.prototype.specialty = "none"; すると、jane オブジェクトの specialty プロパティの値は "none" になります。 もう 1 つの継承方法は .call/.apply メソッドを使うことです。以下のものは同等です。 function Engineer (name, projs, mach) { this.base = WorkerBee; this.base(name, "engineering", projs); this.machine = mach || ""; } function Engineer (name, projs, mach) { WorkerBee.call(this, name, "engineering", projs); this.machine = mach || ""; } JavaScript の .call メソッドを使うことで実装がよりきれいになります。".base" が全く必要ないからです。 プロパティの継承、再び これまでのセクションでは JavaScript のコンストラクタとプロトタイプが階層と継承をどのように実現しているかを説明してきました。このセクションでは、これまでの議論では必ずしも明白ではなかった細かい部分について議論していきます。 ローカル値と継承値 インスタンス関係の決定 コンストラクタにおけるグローバル情報 多重継承のようなもの ローカル値と継承値 オブジェクトのプロパティにアクセスすると、この章で先に説明したように JavaScript は次のステップを実行します。 1.その値がローカルに存在するかを確かめる。存在している場合はその値を返す。 2.値がローカルには存在していない場合、プロトタイプチェーンを確認する(__proto__ プロパティを使用)。 3.プロトタイプチェーン内のオブジェクトが指定したプロパティの値を持っている場合、その値を返す。 4.そのようなプロパティが見つからなければ、そのオブジェクトにそのプロパティは存在しない。 このステップの結果はそれまでにどのようにオブジェクトを定義してきたかによります。元の例では次の定義を用いました。 function Employee () { this.name = ""; this.dept = "general"; } function WorkerBee () { this.projects = []; } WorkerBee.prototype = new Employee; この定義を前提とし、次の文を用いて WorkerBee のインスタンスとして amy を作成するとします。 amy = new WorkerBee; amy オブジェクトにはローカルプロパティが 1 つあります。それは projects です。name および dept プロパティの値は amy にとってはローカルではないため、amy オブジェクトの __proto__ プロパティから取得されます。その結果、amy には次のプロパティ値が存在することになります。 amy.name == ""; amy.dept == "general"; amy.projects == []; ここで、Employee に結びつけられたプロトタイプの name プロパティの値を変えるとします。 Employee.prototype.name = "Unknown" 一見、Employee の全インスタンスに新しい値が反映されるように思われます。しかしそうはなりません。 Employee オブジェクトのどんなインスタンスを作成しても、そのインスタンスは name プロパティに対するローカル値(空文字列)を持つことになります。新しい Employee オブジェクトを作成して WorkerBee プロトタイプをセットすると、WorkerBee.prototype は name プロパティに対するローカル値を持つということです。そのため、JavaScript が amy オブジェクト(WorkerBee のインスタンス)の name プロパティを探すと、JavaScript はそのプロパティに対するローカル値を WorkerBee.prototype 内で発見します。そして Employee.prototype へのチェーンの検索を停止します。 実行時にオブジェクトのプロパティの値を変更し、新しい値がそのオブジェクトのすべての子孫に継承されるようにしたい場合は、そのオブジェクトのコンストラクタ関数内でそのプロパティを定義してはいけません。その代わりにコンストラクタ関数に結びつけられたプロトタイプにそれを追加します。例えば、先のコードを次のように変更するとします。 function Employee () { this.dept = "general"; } Employee.prototype.name = ""; function WorkerBee () { this.projects = []; } WorkerBee.prototype = new Employee; amy = new WorkerBee; Employee.prototype.name = "Unknown"; この場合は amy の name プロパティは "Unknown" になります。 この例が示すように、オブジェクトのプロパティにデフォルト値を持たせ、実行時にデフォルト値を変更できるようにしたいのであれば、コンストラクタ関数自体の中ではなく、そのコンストラクタのプロトタイプでプロパティをセットするようにしてください。 インスタンス関係の決定 あるオブジェクトについて、プロトタイプチェーンにどんなオブジェクトがあるかを知りたい場面があるかもしれません。そうすることでこのオブジェクトはどのオブジェクトからプロパティを継承しているのかがわかります。 JavaScript 1.4 からは instanceof 演算子が導入され、プロトタイプチェーンをテストできるようになりました。この演算子は下で示す instanceOf 関数と全く同じように動作します。 プロパティの継承 で議論したように、コンストラクタ関数とともに new 演算子を用いて新しいオブジェクトを作成するとき、JavaScript は新しいオブジェクトの __proto__ プロパティにコンストラクタ関数の prototype プロパティの値をセットします。これを使用するとプロトタイプチェーンをテストすることができます。 例えば、既に示してある一連の定義を用います。プロトタイプもきちんとセットされているものとします。次のようにして __proto__ オブジェクトを作成します。 chris = new Engineer("Pigman, Chris", ["jsd"], "fiji"); このオブジェクトについて、以下の文はすべて true になります。 chris.__proto__ == Engineer.prototype; chris.__proto__.__proto__ == WorkerBee.prototype; chris.__proto__.__proto__.__proto__ == Employee.prototype; chris.__proto__.__proto__.__proto__.__proto__ == Object.prototype; chris.__proto__.__proto__.__proto__.__proto__.__proto__ == null; ここで次のような instanceOf 関数を書いてみます。 function instanceOf(object, constructor) { while (object != null) { if (object == constructor.prototype) return true; object = object.__proto__; } return false; } この定義を用いると、以下の式はすべて true になります。 instanceOf (chris, Engineer) instanceOf (chris, WorkerBee) instanceOf (chris, Employee) instanceOf (chris, Object) しかし次の式は false になります。 instanceOf (chris, SalesPerson) コンストラクタにおけるグローバル情報 コンストラクタを作成する際、コンストラクタ内でグローバル情報をセットする場合は注意が必要です。例えば、一意的な ID をそれぞれの新しい従業員情報に自動的に代入したいとします。そこで以下のように Employee を定義します。 var idCounter = 1; function Employee (name, dept) { this.name = name || ""; this.dept = dept || "general"; this.id = idCounter++; } この定義を用いると、新しい Employee を作成するときに、コンストラクタに次の ID が順々に代入され、グローバル ID カウンタがインクリメントされます。その結果、以下の文を続けると victoria.id は 1 になり harry.id は 2 になります。 victoria = new Employee("Pigbert, Victoria", "pubs") harry = new Employee("Tschopik, Harry", "sales") 一見これは申し分なさそうです。しかし、idCounter はどんな用途であろうと Employee オブジェクトが作成されるたびにインクリメントされます。この章で示した Employee の階層全体を作成すると、Employee コンストラクタはプロトタイプをセットアップするたびに呼び出されます。次のコードを想定します。 var idCounter = 1; function Employee (name, dept) { this.name = name || ""; this.dept = dept || "general"; this.id = idCounter++; } function Manager (name, dept, reports) {...} Manager.prototype = new Employee; function WorkerBee (name, dept, projs) {...} WorkerBee.prototype = new Employee; function Engineer (name, projs, mach) {...} Engineer.prototype = new WorkerBee; function SalesPerson (name, projs, quota) {...} SalesPerson.prototype = new WorkerBee; mac = new Engineer("Wood, Mac"); さらに、ここでは省かれている定義に base プロパティがあり、その定義がプロトタイプチェーンにおいて上位のコンストラクタを呼び出すとします。この場合、mac オブジェクトが作成されるまでに mac.id が 5 になります。 カウンタが余計にインクリメントされることが問題になるかならないかは、そのアプリケーション次第です。このカウンタの正確な値が必要であれば、代わりに次のコンストラクタを使うという 1 つの解決策が考えられます。 function Employee (name, dept) { this.name = name || ""; this.dept = dept || "general"; if (name) this.id = idCounter++; } プロトタイプとして使用するために Employee のインスタンスを作成するときはコンストラクタに引数を与えてはいけません。このコンストラクタの定義では、引数を渡さないときはコンストラクタが値を id に代入せず、カウンタを更新することもありません。そのため、Employee が id に値を代入するようにするときは従業員の名前を指定する必要があります。この例では mac.id は 1 になります。 多重継承のようなもの オブジェクト指向言語の中には多重継承を許容するものもあります。つまり、オブジェクトは無関係な親オブジェクトからプロパティと値を継承できるということです。JavaScript は多重継承をサポートしていません。 実行時のプロパティ値の継承は、JavaScript が値を見つけようとオブジェクトのプロトタイプチェーンをサーチすることで行われます。オブジェクトに結びつけられたプロトタイプは 1 つであるため、JavaScript は複数のプロトタイプチェーンから動的に継承することはできません。 JavaScript ではコンストラクタ関数がその中で複数の別のコンストラクタ関数を呼び出すようにすることができます。これによって多重継承のようなものが実現できます。例えば以下の文があるとします。 function Hobbyist (hobby) { this.hobby = hobby || "scuba"; } function Engineer (name, projs, mach, hobby) { this.base1 = WorkerBee; this.base1(name, "engineering", projs); this.base2 = Hobbyist; this.base2(hobby); this.machine = mach || ""; } Engineer.prototype = new WorkerBee; dennis = new Engineer("Doe, Dennis", ["collabra"], "hugo") さらに、WorkerBee の定義はこの章で先に使用したものであるとします。この場合 dennis オブジェクトにはこれらのプロパティが存在します。 dennis.name == "Doe, Dennis" dennis.dept == "engineering" dennis.projects == ["collabra"] dennis.machine == "hugo" dennis.hobby == "scuba" dennis は Hobbyist コンストラクタから hobby プロパティを取得しているのです。ここで Hobbyist コンストラクタのプロトタイプにプロパティを追加してみます。 Hobbyist.prototype.equipment = ["mask", "fins", "regulator", "bcd"] こうしても dennis オブジェクトはこの新しいプロパティを継承しません。
https://w.atwiki.jp/0x0b/pages/68.html
式(Expression) 基本式(Primary) Syntax PrimaryExpression this Identifier Literal ArrayLiteral ObjectLiteral ( Expression ) this キーワード (this Keyword) this キーワードは実行コンテキストの this 値を評価する。 識別子参照(Identifier Reference) 識別子は、(実行コンテキスト スコープ連鎖と識別子の解決)で述べたスコープ規則を使用して評価される。この識別子評価の結果は常に Reference 型の値である。 リテラル参照 リテラルは(字句について リテラル)に述べるように評価される。 Array 初期化子 Array 初期化子は、 Array オブジェクトの初期化を記述する式で、リテラル形式で書かれる。それは配列要素をあらわす 0 個以上の式のリストで、それぞれ角括弧 "[ ]" で囲まれる。要素はリテラルである必要はない; それらは Array 初期化子が評価される度に評価される。 配列要素は要素リストの開始、中間、末尾で省略もできる。要素リスト中で AssignmentExpression の先行しないカンマは、欠けた配列要素が Array の長さに寄与し、続く要素のインデックスを増加させる。省略された配列要素は定義されない。 Syntax ArrayLiteral [ Elisionopt ] [ ElementList ] [ ElementList , Elisionopt ] ElementList Elisionopt AssignmentExpression ElementList , Elisionopt AssignmentExpression Elision , Elision , Semantics 生成規則 ArrayLiteral [ Elisionopt ] は、次のように評価される 式 new Array() と同様に、新規に配列を生成する。 Elision を評価; 存在しなければ、数値 0 を用いる。 Result(1) の Put メソッドを、引数 "length" と Result(2) で呼出す。 Result(1) を返す。 生成規則 ArrayLiteral [ ElementList ] は、次のように評価される ElementList を評価。 Result(1) を返す。 生成規則 ArrayLiteral [ ElementList , Elisionopt ] は、次のように評価される ElementList を評価。 Elision を評価; 存在しなければ、数値 0 を用いる。 Result(1) の Get メソッドを、引数 "length" で呼出す。 Result(1) の Put メソッドを、引数 "length" と (Result(2)+Result(3)) で呼出す。 Result(1) を返す。 生成規則 ElementList Elisionopt AssignmentExpression は、次のように評価される 式 new Array() と同様に、新規に配列を生成する。 Elision を評価; 存在しなければ、数値 0 を用いる。 AssignmentExpression を評価。 GetValue(Result(3)) を呼出す。 Result(1) の Put メソッドを、引数 Result(2) と Result(4) で呼出す。 Result(1) を返す。 生成規則 ElementList ElementList , Elisionopt AssignmentExpression は、次のように評価される ElementList を評価。 Elision を評価; 存在しなければ、数値 0 を用いる。 AssignmentExpression を評価。 GetValue(Result(3)) を呼出す。 Result(1) の Get メソッドを、引数 "length" で呼出す。 Result(1) の Put メソッドを、引数 (Result(2)+Result(5)) と Result(4) で呼出す。 Result(1) を返す。 生成規則 Elision , は、次のように評価される 数値 1 を返す。 生成規則 Elision Elision , は、次のように評価される Elision を評価。 (Result(1)+1) を返す。 オブジェクト初期化子 オブジェクト初期化子は Object の初期化を記述する式であり、リテラルのような形式で書かれる。プロパティ名とその値の 0 個以上の組のリストを { } で囲む。値はリテラルである必要はない; オブジェクト初期化子が評価される度に、それは評価される。 Syntax ObjectLiteral { } { PropertyNameAndValueList } PropertyNameAndValueList PropertyName AssignmentExpression PropertyNameAndValueList , PropertyName AssignmentExpression PropertyName Identifier StringLiteral NumericLiteral Semantics 生成規則 ObjectLiteral { } は、次のように評価される 式 new Object() と同様に新規にオブジェクトを生成する。 Result(1) を返す。 生成規則 ObjectLiteral { PropertyNameAndValueList } は、次のように評価される PropertyNameAndValueList を評価。 Result(1) を返す; 生成規則 PropertyNameAndValueList PropertyName AssignmentExpression は、次のように評価される 式 new Object() と同様に新規にオブジェクトを生成する。 PropertyName を評価。 AssignmentExpression を評価。 GetValue(Result(3)) を呼出す。 Result(1) の Put メソッドを、引数 Result(2) と Result(4) で呼出す。 Result(1) を返す。 生成規則 PropertyNameAndValueList PropertyNameAndValueList , PropertyName AssignmentExpression は、次のように評価される PropertyNameAndValueList を評価。 PropertyName を評価。 AssignmentExpression を評価。 GetValue(Result(3)) を呼出す。 Result(1) の Put メソッドを、引数 Result(2) と Result(4) で呼出す。 Result(1) を返す。 生成規則 PropertyName Identifier は、次のように評価される Identifier と同じ文字シーケンスで構成される文字列リテラルを形成する。 Result(1) を返す。 生成規則 PropertyName StringLiteral は、次のように評価される StringLiteral の値を返す。 生成規則 PropertyName NumericLiteral は、次のように評価される NumericLiteral の値を形成する。 ToString(Result(1)) を返す。 グループ化演算子 生成規則 PrimaryExpression ( Expression ) は、次のように評価される Expression を評価。これは Reference 型でもよい。 Result(1) を返す。 NOTE このアルゴリズムは、 Result(1) に GetValue を適用しない。 delete や typeof のような演算子に括弧のついた式を適用できるようにすることがこれについての主な動機である。 文(Statement) Syntax Statement Block VariableStatement EmptyStatement ExpressionStatement IfStatement IterationStatement ContinueStatement BreakStatement ReturnStatement WithStatement LabelledStatement SwitchStatement ThrowStatement TryStatement Semantics Statement は LabelledStatement の一部となりうるし、それ自身が LabelledStatement の一部であってもよく、以下同様である。この方法でつけられたラベルは、個々の文の意味論記述において "現在のラベルセット (current label set)" として併せて参照される。 LabelledStatement はラベルセットへのラベルの導入以外の意味論を持たない。 IterationStatement または SwitchStatement のラベルセットは最初は単一の要素 empty で構成される。任意の他の文のラベルセットは初期は empty である。 ブロック (Block) Syntax Block { StatementListopt } StatementList Statement StatementList Statement Semantics 生成規則 Block { } は、次のように評価される (normal, empty, empty) を返す。 生成規則 Block { StatementList } は、次のように評価される StatementList を評価。 Result(1) を返す。 生成規則 StatementList Statement は、次のように評価される Statement を評価。 例外が投げられたら、(throw, V, empty) を返す。 V は例外である。 (ここでは例外が返されないかのように実行は進行する。) Result(1) を返す。 生成規則 StatementList StatementList Statement は、次のように評価される StatementList を評価。 Result(1) が中途完了であれば、 Result(1) を返す。 Statement を評価。 例外が投げられたら、(throw, V, empty) を返す。 V は例外である。 (ここでは例外が返されないかのように実行は進行する。) Result(3).value が empty であれば、 V = Result(1).value とし、そうでなければ V = Result(3).value とする。 (Result(3).type, V, Result(3).target) を返す。 変数文 Syntax VariableStatement var VariableDeclarationList ; VariableDeclarationList VariableDeclaration VariableDeclarationList , VariableDeclaration VariableDeclarationListNoIn VariableDeclarationNoIn VariableDeclarationListNoIn , VariableDeclarationNoIn VariableDeclaration Identifier Initialiseropt VariableDeclarationNoIn Identifier InitialiserNoInopt Initialiser = AssignmentExpression InitialiserNoIn = AssignmentExpressionNoIn Description FunctionDeclaration 内部で変数文が発生するならば、その変数は、(実行コンテキスト 変数の実体化)にあるように、その関数内の関数ローカルスコープで定義される。そうでないならば、それらはプロパティ属性 { DontDelete } のグローバルスコープで定義される(つまり、(実行コンテキスト 変数の実体化)にあるグローバルオブジェクトのメンバとして作成される)。変数は実行スコープに入ったときに生成される。 Block は新しい実行スコープを定義しない。 Program と FunctionDeclaration だけが新しいスコープを生成する。生成時、変数は undefined で初期化される。イニシャライザを持つ変数が AssignmentExpression の値を代入されるのは VariableStatement が実行されるときであり、変数が生成されたときではない。 Semantics 生成規則 VariableStatement var VariableDeclarationList ; は、次のように評価される VariableDeclarationList を評価。 (normal, empty, empty) を返す。 生成規則 VariableDeclarationList VariableDeclaration は、次のように評価される VariableDeclaration を評価。 生成規則 VariableDeclarationList VariableDeclarationList , VariableDeclaration は、次のように評価される VariableDeclarationList を評価。 VariableDeclaration を評価。 生成規則 VariableDeclaration Identifier は、次のように評価される Identifier と同じ文字シーケンスで構成される文字列値を返す。 生成規則 VariableDeclaration Identifier Initialiser は、次のように評価される (文 識別子参照)にあるように Identifier を評価。 Initialiser を評価。 GetValue(Result(2)) を呼出す。 PutValue(Result(1), Result(3)) を呼出す。 Identifier と同じ文字シーケンスで構成される文字列値を返す。 生成規則 Initialiser = AssignmentExpression は、次のように評価される AssignmentExpression を評価。 Result(1) を返す。 生成規則 VariableDeclarationListNoIn, VariableDeclarationNoIn, InitialiserNoIn は、生成規則 VariableDeclarationList, VariableDeclaration, Initialiser と同様に評価されるが、 VariableDeclarationList, VariableDeclaration, Initialiser, AssignmentExpression の代わりに、それぞれ VariableDeclarationListNoIn, VariableDeclarationNoIn, InitialiserNoIn, AssignmentExpressionNoIn が評価される。 空文 Syntax EmptyStatement ; Semantics 生成規則 EmptyStatement ; は、次のように評価される (normal, empty, empty) を返す。 式文 Syntax ExpressionStatement [lookahead ∉ {{, function} ] Expression ; Block と曖昧になることから、 ExpressionStatement は大括弧 "{" で開始することはできないことに注意。また、 FunctionDeclaration と曖昧になることから、 ExpressionStatement は function キーワードで開始することもできない。 Semantics 生成規則 ExpressionStatement [lookahead ∉ {{, function}] Expression ; は、次のように評価される Expression を評価する。 GetValue(Result(1)) を呼出す。 (normal, Result(2), empty) を返す。 if 文 * Syntax IfStatement if ( Expression ) Statement else Statement if ( Expression ) Statement 関連する if の選択が曖昧な else は、可能な限り最も近い、関連しなければ該当する else がないような if にそれぞれ関連している。 Semantics 生成規則 IfStatement if ( Expression ) Statement else Statement は、次のように評価される Expression を評価。 GetValue(Result(1)) を呼出す。 ToBoolean(Result(2)) を呼出す。 Result(3) が false ならば、ステップ 7 へ。 最初の Statement を評価。 Result(5) を返す。 2 番目の Statement を評価。 Result(7) を返す。 生成規則 IfStatement if ( Expression ) Statement は、次のように評価される Expression を評価。 GetValue(Result(1)) を呼出す。 ToBoolean(Result(2)) を呼出す。 Result(3) が false ならば、 (normal, empty, empty) を返す。 Result(3) が false ならば、 (normal, empty, empty) を返す。 Statement を評価。 Result(5) を返す。 繰返し文(Iteration) 繰返し文は (キーワードと括弧の制御構造で構成される) ヘッダと (Statement で構成される) 本文で構成される。 Syntax IterationStatement do Statement while ( Expression ); while ( Expression ) Statement for (ExpressionNoInopt; Expressionopt ; Expressionopt ) Statement for ( var VariableDeclarationListNoIn; Expressionopt ; Expressionopt ) Statement for ( LeftHandSideExpression in Expression ) Statement for ( var VariableDeclarationNoIn in Expression ) Statement do-while文 生成規則 do Statement while ( Expression ); は、次のように評価される V = empty とする。 Statement を評価。 Result(2).value が empty でなければ、 V = Result(2).value とする。 Result(2).type が continue で、かつ Result(2).target が現在のラベルセット内にあれば、ステップ 7 へ。 Result(2).type が break で、かつ Result(2).target が現在のラベルセット内にあれば、 (normal, V, empty) を返す。 Result(2) が中途完了ならば、 Result(2) を返す。 Expression を評価。 GetValue(Result(7)) を呼出す。 ToBoolean(Result(8)) を呼出す。 Result(9) が true ならば、ステップ 2 ヘ。 (normal, V, empty) を返す。 while 文 生成規則 IterationStatement while ( Expression ) Statement は、次のように評価される V = empty とする。 Expression を評価。 GetValue(Result(2)) を呼出す。 ToBoolean(Result(3)) を呼出す。 Result(4) が false ならば、 (normal, V, empty) を返す。 Statement を評価。 Result(6).value が empty でなければ、 V = Result(6).value とする。 Result(6).type が continue かつ Result(6).target が現在のラベルセットならば、ステップ 2 へ。 Result(6).type が break かつ Result(6).target が現在のラベルセットならば、 (normal, V, empty) を返す。 Result(6) が中途完了ならば、 Result(6) を返す。 ステップ 2 へ。 for 文 生成規則 IterationStatement for (ExpressionNoInopt ; Expressionopt ; Expressionopt) Statement は、次のように評価される ExpressionNoIn が存在しなければ、ステップ 4 へ。 ExpressionNoIn を評価。 GetValue(Result(2)) を呼出す。 (この値は使用しない。) V = empty とする。 最初の Expression が存在しなければ、ステップ 10 へ。 最初の Expression を評価。 GetValue(Result(6)) を呼出す。 ToBoolean(Result(7)) を呼出す。 Result(8) が false ならば、ステップ 19 へ。 Statement を評価。 Result(10).value が empty でないならば、 V = Result(10).value とする。 Result(10).type が break かつ Result(10).target が現在のラベルセットならば、ステップ 19 へ。 Result(10).type が continue かつ Result(10).target が現在のラベルセットならば、ステップ 15 へ。 Result(10) が中途完了ならば Result(10) を返す。 2 番目の Expression が存在しなければ、ステップ 5 へ。 2 番目の Expression を評価。 GetValue(Result(16) を呼出す。 (この値は使用しない。) ステップ 5 へ。 (normal, V, empty) を返す。 生成規則 IterationStatement for ( var VariableDeclarationListNoIn ; Expressionopt ; Expressionopt ) Statement は、次のように評価される VariableDeclarationListNoIn を評価。 V = empty とする。 1 個目の Expression が存在しないならば、 ステップ 8 へ。 1 個目の Expression を評価。 GetValue(Result(4)) を呼出す。 ToBoolean(Result(5)) を呼出す。 Result(6) が false ならば、 ステップ 17 へ。 Statement を評価。 Result(8).value が空でないならば、 V = Result(8).value とする。 Result(8).type が break かつ Result(8).target が現在のラベルセット内ならば、 ステップ 17 へ。 Result(8).type が continue かつ Result(8).target が現在のラベルセット内ならば、 ステップ 13 へ。 Result(8) が中途完了ならば、 Result(8) を返す。 2 個目の Expression が存在しないならば、 ステップ 3 へ。 2 個目の Expression を評価。 GetValue(Result(14)) を呼出す。 (この値は使用しない。) ステップ 3 へ。 (normal, V, empty) を返す。 for-in 文 生成規則 IterationStatement for ( LeftHandSideExpression in Expression ) Statement は、次のように評価される Expression を評価。 GetValue(Result(1)) を呼出す。 ToObject(Result(2)) を呼出す。 V = empty とする。 DontEnum 属性を持たない、 Result(3) の次のプロパティの名前を取得する。そのようなプロパティが存在しないならば、 ステップ 14 へ。 LeftHandSideExpression を評価 (これは繰返し評価されてよい)。 PutValue(Result(6), Result(5)) を呼出す。 Statement を評価。 Result(8).value が empty でないならば、 V = Result(8).value とする。 Result(8).type が break かつ Result(8).target が現在のラベルセット内ならば、 ステップ 14 へ。 Result(8).type が continue かつ Result(8).target が現在のラベルセット内ならば、 ステップ 5 へ。 Result(8) が中途完了ならば、 Result(8) を返す。 ステップ 5 へ。 (normal, V, empty) を返す。 生成規則 IterationStatement for ( var VariableDeclarationNoIn in Expression ) Statement は、次のように評価される VariableDeclarationNoIn を評価。 Expression を評価。 GetValue(Result(2)) を呼出す。 ToObject(Result(3)) を呼出す。 V = empty とする。 DontEnum 属性を持たない、 Result(4) の次のプロパティを取得する。そのようなプロパティが存在しないならば、ステップ 15 へ。 それが Identifier であるかのように Result(1) を評価; 11.1.2 参照(これは繰返し評価されてよい). PutValue(Result(7), Result(6)) を呼出す。 Statement を評価。 Result(9).value が empty でないならば、 V = Result(9).value とする。 Result(9).type が break かつ Result(9).target が現在のラベルセット内ならば、 ステップ 15 へ。 Result(9).type が continue かつ Result(9).target が現在のラベルセット内ならば、 ステップ 6 へ。 Result(8) が中途完了ならば、 Result(8) を返す。 ステップ 6 へ。 (normal, V, empty) を返す。 プロパティの列挙方法 (1 個目のアルゴリズムのステップ 5, 2 個目のステップ 6) は実装依存である。列挙の順序はオブジェクトにより定義される。列挙されているオブジェクトのプロパティは列挙中に削除されてもよい。列挙中まだ挙げられていないプロパティが削除されるならば、そのプロパティは列挙されない。列挙中オブジェクトに新しいプロパティが追加されるならば、新たに追加されたプロパティは現在の列挙において挙げられることを保証されない。 オブジェクトのプロパティ列挙は、そのプロトタイプのプロパティ、プロトタイプのプロトタイプのプロパティ、以下同様に再帰的にプロパティを含む; しかし、同名のプロパティを持つプロトタイプチェーン内の前のオブジェクトにより "隠される" ならば、プロトタイプのプロパティは列挙されない。 continue 文 Syntax ContinueStatement continue [LineTerminator 無し] Identifieropt ; Semantics 次のいずれかが真であるとき、プログラムは構文的に不正であると考えられる プログラムが選択的 Identifier を持たない continue 宣言で構成されていて、直接または間接的に(関数の区切りにまたがらない)、 IterationStatement 内にネストしなていない。 プログラムが選択的 Identifier を持つ continue 宣言で構成されていて、閉じた (関数の区切りにはまたがらない) IterationStatement のラベルセット内に Identifier が出現しない Identifier のない ContinueStatement は、次のように評価される (continue, empty, empty) を返す。 Identifier を持つ ContinueStatement は、次のように評価される (continue, empty, Identifier) を返す。 break 文 Syntax BreakStatement break [LineTerminator 無し] Identifieropt ; Semantics 次のいずれかが真である場合、プログラムは構文的に不正であると考えられる プログラムが選択的な Identifier を持たない break 文を含み、それが IterationStatement または SwitchStatement 内部で直接的または間接的にネストしていない。 (関数の境界には交わらない) プログラムが選択的な Identifier を持つ break 文を含み、 Identifier が Statement を囲むラベルセット内に出現しない。 (関数の境界には交わらない) Identifier のない BreakStatement は、次のように評価される (break, empty, empty) を返す。 Identifier のある BreakStatement は、次のように評価される (break, empty, Identifier) を返す。 return 文 Syntax ReturnStatement return [LineTerminator 無し] Expressionopt ; Semantics ECMAScript プログラムは、それが FunctionBody 内部\でない return 文を含む場合、構文的に不正と考えられる。return 文は、関数に実行を停止させ、値を呼出側に返させる。 Expression が省略される場合、戻り値は undefined である。そうでなければ、戻り値は Expression の値である。 生成規則 ReturnStatement return [no LineTerminator here] Expressionopt ; は、次のように評価される Expression が存在しなければ (return, undefined, empty) を返す。 Expression を評価。 GetValue(Result(2)) を呼出す。 (return, Result(3), empty) を返す。 with 文 Syntax WithStatement with ( Expression ) Statement Description with 文は現在の実行コンテキストのスコープ連鎖の先頭に算出されたオブジェクトを追加し、この拡張されたスコープ連鎖を用いて文を実行し、スコープ連鎖を蓄積する。 Semantics 生成規則 WithStatement with ( Expression ) Statement は、次のように評価される Expression を評価。 GetValue(Result(1)) を呼出す。 ToObject(Result(2)) を呼出す。 スコープ連鎖の先頭に Result(3) を追加。 ステップ 4 から拡張されるスコープ連鎖を使用して Statement を評価。 C を Result(5) とする。ステップ 5 で例外が投げられたら、 C を (throw, V, empty) とする。 V のところは例外である。(実行は例外が発生しなかったかのように進行する。) スコープ連鎖の先頭から Result(3) を取り除く。 C を返す。 NOTE 埋め込まれた Statement にどのように制御が残ったとしても、通常でろうと中途完了や例外の形式であろうと、スコープチェーンには常に依然の状態が蓄積される。 switch 文 Syntax SwitchStatement switch ( Expression ) CaseBlock CaseBlock { CaseClausesopt } { CaseClausesopt DefaultClause CaseClausesopt } CaseClauses CaseClause CaseClauses CaseClause CaseClause case Expression StatementListopt DefaultClause default StatementListopt Semantics 生成規則 SwitchStatement switch ( Expression ) CaseBlock は、次のように評価される Expression を評価。 GetValue(Result(1)) を呼出す。 CaseBlock を評価し、パラメータとして Result(2) を渡す。 Result(3).type が break で Result(3).target が現在のラベルセットならば、 (normal, Result(3).value, empty) を返す。 Result(3) を返す。 生成規則 CaseBlock { CaseClausesopt } は入力パラメータ input を与えられ、次のように評価される V = empty とする。 A をソーステキスト順の CaseClause 項目のリストとする。 C を A 内の次の CaseClause とする。そのような CaseClause がなければ、ステップ 16 へ。 C を評価する。 input が !-- 演算子で定義されるように等しくなければ、 ステップ 3 へ。 C が StatementList を持たなければ、ステップ 10 へ。 C の StatementList を評価し、 R をその結果とする。 R が中途完了ならば、 R を返す。 V = R.value とする。 C を A 内の次の CaseClause とする。そのような CaseClause がなければ、ステップ 16 へ。 C が StatementList を持たなければ、ステップ 10 へ。 C の StatementList を評価し、 R をその結果とする。 R.value が empty でなければ、 V = R.value とする。 R が中途完了ならば、 (R.type, V, R.target) を返す。 ステップ 10 へ。 (normal, V, empty) を返す。 生成規則 CaseBlock { CaseClausesopt DefaultClause CaseClausesopt } は入力パらメータ input を与えられ、次のように評価される V = empty とする。 A を 1 個目の CaseCloses 内のソーステキスト順の CaseClause 項目のリストとする。 C を A 内の次の CaseClause とする。そのような CaseClause がなければ、ステップ 11 へ。 C を評価する。 input が Result(4) と !== 演算子により定義されるように等しくなければ、ステップ 3 へ。 C が StatementList を持たなければ、ステップ 20 へ。 C の StatementList を評価し、 R をその結果とする。 R が中途完了ならば、 R を返す。 V = R.value とする。 ステップ 20 へ。 B を 2 個目の CaseClauses 内のソーステキスト順の CaseClause 項目のリストとする。 C を B 内の次の CaseClause とする。そのような CaseClause がなければ、ステップ 26 へ。 C を評価する。 input が Result(13) と !== 演算子により定義されるように等しくなければ、ステップ 12 へ。 C が StatementList を持たなければステップ 31 へ。 C の StatementList を評価し、 R を結果とする。 R が中途完了ならば R を返す。 V = R.value とする。 ステップ 31 へ。 C を A 内の次の CaseClause とする。そのような CaseClause がなければ、ステップ 26 へ。 C が StatementList を持たなければ、ステップ 20 へ。 C の StatementList を評価し、 R をその結果とする。 R.value が empty でなければ、 V = R.value とする。 R が中途完了ならば、 (R.type, V, R.target) を返す。 ステップ 20 へ。 DefaultClause が StatementList を持たなければ、ステップ 30 へ。 DefaultClause の StatementList を評価し、 R をその結果とする。 R.value が empty でなければ、 V = R.value とする。 R が中途完了ならば、 (R.type, V, R.target) を返す。 B を 2 個目の CaseClauses 内のソーステキスト順の CaseClause 項目のリストとする。 C を B 内の次の CaseClause とする。そのような CaseClause がなければ、ステップ 37 へ。 C が StatementList を持たないならば、ステップ 31 へ。 C の StatementList を評価し、 R をその結果とする。 R.value が empty でないならば、 V = R.value とする。 R が中途完了ならば、 (R.type, V, R.target) を返す。 ステップ 31 へ。 (normal, V, empty) を返す。 生成規則 CaseClause case Expression StatementListopt は、次のように評価される Expression を評価。 GetValue(Result(1)) を呼出す。 Result(2) を返す。 NOTE CaseClause 評価は関連 StatementList を実行しない。単純に Expression を評価し、 StatementList 実行開始判定に CaseBlock アルゴリズムが用いる値を返す。 ラベル付き文 Syntax LabelledStatement Identifier Statement Semantics Statement にラベルを先行させてよい。ラベル付き文は、ラベル付き break 及び continue 文とともに使用されるだけである。 ECMAScript は goto 文を持たない。 ECMAScript プログラムは、 LabelledStatement によってラベルと同じ Identifier で閉じられている LabelledStatement を含む場合、構文的に不正であると考えられる。これは、ラベル付けされた文中でネストされる FunctionDeclaration の本文内に直接あるいは間接的に現われるラベルには当てはまらない。 生成規則 Identifier Statement は、 Statement のラベルセットに Identifier を追加する形で評価され、 Statement を評価する。 LabelledStatement 自身が空でないラベルセットを持つならば、それらのラベルはまたそれが評価される前に Statement のラベルセットに追加される。 L を Identifier と等しいとして Statement 評価の結果が (break, V, L) ならば、生成規則は (normal, V, empty) を結果とする。 LabelledStatement の評価に先立って、含まれる Statement は空のラベルセットを所有すると見なされるが、それが IterationStatement あるいは SwitchStatement ならば、その場合それは単一の要素 empty からなるラベルセットを所有すると見なされる。 throw 文 Syntax ThrowStatement throw [LineTerminator 無し] Expression ; Semantics 生成規則 ThrowStatement throw [no LineTerminator here] Expression ; は、次のように評価される Expression を評価。 GetValue(Result(1)) を呼出す。 (throw, Result(2), empty) を返す。 try 文 Syntax TryStatement try Block Catch try Block Finally try Block Catch Finally Catch catch (Identifier ) Block Finally finally Block Description try 文は、実行時エラーや throw 文のような例外的条件が発生するコードのブロックを囲む。 catch クローズは例外にハンドリングされるコードを提供する。 catch クローズが例外を受け取るとき、その Identifier は発生した例外にバインドされる。 Semantics 生成規則 TryStatement try Block Catch は、次のように評価される Block を評価。 Result(1).type が throw でなければ、 Result(1) を返す。 パラメータ に Result(1) を以って Catch を評価。 Result(3) を返す。 生成規則 TryStatement try Block Finally は、次のように評価される Block を評価。 Finally を評価。 Result(2).type が normal ならば、 Result(1) を返す。 Result(2) を返す。 生成規則 TryStatement try Block Catch Finally は、次のように評価される Block を評価。 C = Result(1) とする。 Result(1).type が throw でなければ、ステップ 6 へ。 パラメータ に Result(1) を以って Catch を評価。 C = Result(4) とする。 Finally を評価。 Result(6).type が normal ならば、 C を返す。 Result(6) を返す。 生成規則 Catch catch ( Identifier ) Block は、次のように評価される C をこの生成規則に渡されているパラメータとする。 式 new Object() によるものであるかのように、新しいオブジェクトを生成する。 Result(2) にプロパティを作成する。プロパティ名は Identifier, 値は C.value, 属性は { DontDelete } である。 スコープ連鎖の先頭に Result(2) を追加。 Block を評価。 スコープ連鎖の先頭から Result(2) を取り除く。 Result(5) を返す。 生成規則 Finally finally Block は、次のように評価される Block を評価。 Result(1) を返す。
https://w.atwiki.jp/xbox360score/pages/403.html
Bliss Island 項目数 12 総ポイント 200 難易度 配信日 2008年3月13日 DL費用 400MSP ジャンル パズル ワード ☆国内未配信 Fruit Smoothie Complete Fruit Smoothie in adventure mode. 5 Brick Invaders Complete Brick Invaders in adventure mode. 10 Bronze Levels Bronze Levels. 15 Silver Levels Complete all the silver levels. 20 Gold Levels Complete all the gold levels. 25 First Medal Win a medal by completing a task. 5 Three Medals Win three medals by completing three tasks. 10 Bronze Medals Win all the bronze medals. 15 Silver Medals Win all the silver medals. 25 Gold Medals Win all the gold medals. 35 Three-Nil Win a game of Fluffy Football 3-0. 15 Five-Nil Win a game of Multiplayer Forest Frenzy 5-0. 20
https://w.atwiki.jp/technology17/pages/231.html
過程配属が極めて危険な軍団。 梵語を筆頭に、さるみーん、あなごさん等が挙げられる。
https://w.atwiki.jp/index-ss/pages/1431.html
学園都市。 超能力開発の研究を行う大規模な都市。その人口は二三〇万人弱でかつ、その八割は学生というまさに学生のための街。そのうちの1人である特性「不幸」の高校生、上条当麻はその日は朝食がないという不幸に襲われていた。 彼1人ならばこの不幸も少しの我慢で済んだのであろう。だがしかし、彼にはそれでは済まされない理由があった。 その不幸の理由が台所の冷蔵庫の前に立つ彼の背後の机から声をあげる。 「と~う~ま~。おなかがすいたんだよ。」 そこには机の上に顔を預け、その両手に箸を一本ずつ握ってダンダンと音を鳴らして抗議をするなかなか愉快な格好の少女がいた。 彼女の名前はインデックス。 一〇万三〇〇〇冊の魔導書を記憶するその少女は上条家のエンゲル係数を急激に跳ね上げるその食欲が満たされないためにご機嫌斜めである。 「つっても、昨日寝る前にこっそり予備の分のパンを食べたのは誰だよインデックス?」 「むむむ・・・でもとうまがそもそも作ったばかりの朝ごはんを丸ごとひっくり返さなきゃこんなことにはならなかったんじゃないかな!?」 そもそも、今日の彼の不幸の原因はこれである。 じつは今日に限って目覚ましが鳴らず、時間ギリギリであろうともやはり朝メシ抜きなどこの腹ペコシスターさんが許すわけもなく、いつものように朝食をつくるために台所に立つ彼の足元に自分のご飯がこないことに痺れを切らし『まだー!?ごはんまだー!?』とでもいうかのごとく突撃してきた三毛猫を踏みそうになるのを避けようとした結果、上条が作った朝食は突撃兵の差し出されることになった。 更には目の前の冷蔵庫の中身が空というコンボつきである。 食卓にはテレビの音が流れる。どうやら最近学園都市で開発された最新の特殊素材についてのニュースなんかをしているらしい。 そんなキャスターの声をバックミュージックに、空の冷蔵庫を閉めた上条は少し考えた後、仁王立ちで目の前の少女の前に立つ。 「はーっはっは!この毎日が絶賛不幸中の上条当麻さんがまさか毎日食事をひっくり返さずにいれるとでも?こんなことがあるから予備のパンを用意してたのにそれを考えずに食べてしまったインデックスさんがやっぱり悪いと思います。」 「・・・・・とーま、ひらきなおったところでとうまがご飯をひっくり返した事実は消えないんだよ?」 「うっ、やっぱだめか・・・でももう正直時間ねーんだ、わるいけど今日だけ朝飯は勘弁してもらえねーか?」 「お昼は?」 「あっ・・・」 インデックスがゆらりと立ち上がる。 「ふーん・・・とうまはわたしお腹がすいて倒れてもいいっていうんだね?」 純白シスターが半目でこちらを睨みながら話しかける。 「え」 「とうまは自分だけ学校でお昼食べようっていうんだね!?」 その服にも負けない白い歯をむき出しにしてぐいぐいと上条に迫る。 「ちょ、ちょっとまて!落ち着けインデ」 「お腹空いたお腹空いたお腹空いたお腹空いたぁぁぁっ!!」 相手の言葉をさえぎって、インデックスが上条に飛び掛った。 「わかった!わかったから痛たたたたたたたたっ!?」 当初の作戦に失敗した上条の頭にいつもどおりに銀髪シスターが噛りつく。あぁ、今日も不幸だと遠のきかけた意識の中で思った少年は、とりあえず近くのコンビ二まで走ることを決意した。 学園都市のある高校までの道を、やたら高そうな黒塗りの車が走る。内装にもやたら金が掛かっていそうなその車内には、学生服の少年と数名の黒スーツがやわらかそうなシートに腰掛けていた。 その黒スーツの1人の初老の男が学生服に話しかける。 「しばらくはこれから向かう学校に通っていただくことになります。こちらの準備にはまだ時間が掛かります故、その間お待たせすることになりますから。あと補足事項についてなのですが」 「もういい。」 少年が無造作に男の話をきった。 「なんど確認すれば気が済む。それにこんなものものしい送迎はいらん。帰りは来んな、一人でいい。」 明らかに不機嫌な顔で少年は不満を目の前の初老の男に浴びせる。 「なりません。送迎はさせていただきます。必要なこと故。」 「ならリア、お前1人で来い。他はいい。」 リア、と呼ばれた黒スーツの少女は自分に話しが回ってくると思っていなかったのかえぇっと声を漏らし、すぐに対応できずにいた。その横から初老の男が代わりに答える。 「わかりました、迎えにはリアをよこしましょう。では確認を続けさせてもらいます。この儀式を成立させるためにはどのような些細なことも見逃すわけにはいきません故。」 「・・・・・・・」 これ以上いっても無駄だと悟ったのだろう、少年はしゃべることをやめた。横では男がそれを合図とし、また話し始める。 いい加減聞き飽きた確認を黙って聞き流すことにした少年は窓から外の景色を眺める。そこには、大画面を持つ飛行船やおそらく研究機関であろう建物など学園都市ならではの独特な景色が広がっていた。それすらも見流しながらただ少年は思う。 (わかってんよ・・・) 少年は無意識に顔を険しくさせる。もっとも、それに気付くものは少年を含め車内には誰もいないが。 (失敗するわけにはいかない) 「転校生?」 「そうなんよ。カミやんが遅刻してる間に、隣のクラスに来たんやで。」 結局、あれから大急ぎで近くのコンビ二までひとっ走りしてきたあげく両手にパンを持って帰ってくると土御門の義理の妹がしっかりインデックスのご飯のお世話をしてくれており、そのことで肉体的にも精神的にも憔悴した上条が学校にたどり着いたのは3時間目の授業のはじめだった。 遅刻してきたことに国語教師にねちねちと小言を聞かされ三重苦をしっかり味わった不幸の少年上条当麻に、彼のクラスメイトである青髪ピアスが答えた。その横の土御門元春も軽い調子で続ける。 「ちょっと童顔だけどまー美形で登校には高級車での送迎、おまけにうわさじゃレベル4の能力者だってウワサぜよ。なんつーかなんでこの学校にきたんだろーにゃー。」 彼らの学校は別に常盤台のようにご立派な教育目的や長点上機学園のような優れた設備があるというわけでもないごく普通、あるいはやや下層レベルの高等学校である。 そこにレベル4という学園都市におけるエリートが転校というのは、土御門でなくとも違和感を持つであろう。 その違和感以上に朝っぱらから居候のシスターに噛みつかれた頭の傷を気にしつつ上条は、 「ウワサなんだろ。それより転校生が来るなんて話、言ってたっけ?」 「そこは小萌先生も知らなかったみたいだぜぃ。なんでも今朝の職員会議で急に聞かされたとか言ってたしにゃー。」 ふ~ん、そんなこともあるんだなと上条は適当にその話を流す。というより、家で今日使うはずの体力のほとんどを消費し、そのせいで頭を回転させる気が起こらないという方がしっくりくる。まぁ、それじゃあ普段は頭を回転させているかといわれれば何とも言えないところではあるのだが。 「・・・で、なんでお前は俺の腕をそんなに引っ張ってるんですか?」 「ノリが悪いなーカミやん、もちろんその転校生を見学にいくんやないですか。」 上条はいつもと変わらぬテンションで腕を引っ張ってくる級友に対し、机に重力を完全に預けたまま、 「転校してきたばっかのやつを動物園のパンダみたいにみてやンなって、ほっといてやれよ。 あと上条さんのことも今日はできればそっとしておいてくれ・・・」 「にゃー。ナニ年寄りくさいこと言ってんだカミやん。ウワサのエリートを確認しとかねーとにゃー。それに転校生なんてイベント、盛り上がらないでどーすんぜよ?」 じゃあ姫神(あたし)のときは?と軽く思う上条と少し離れた席から聞こえた会話にかなりへこむ姫神。 そんな2人を無視して、ほらいくぜぃとなかば強引に上条を引っ張って教室を出て行く土御門と青髪ピアス。 「あたしのときは・・・?」 某国の黒服と手をつなぐ宇宙人の写真のような形のデルタフォースを尻目に、姫神秋沙は下を向きながら黒いオーラをかもし出していた。 ところ変わって隣のクラス。 その前の廊下には別のクラスの人間が休日のデパートよろしく、男女問わず集まっていた。 「なんだこりゃ。休憩時間は二回もあったのになんでまだこんなに人が集まってんだよ?」 「それが若さってモンだにゃーカミやん。まーあれみりゃ納得できるか。」 そう言って土御門は教室のうしろの人だかりの方に向かって指をさす。 周りの野次馬が邪魔になって途切れ途切れにしか見えないが、なるほどそこには端正な顔つきの少年が自分の席に腰掛けていた。少し茶色がかった髪で見え隠れしている顔は、彼のあまり高くない身長も相まって少し幼くも見える。 「まーたしかに・・・。けどお前らが転校生に興味持つって珍しいな、相手が女子だったらわかるけど。」 上条の言葉に金髪にサングラスの男は腕を組んで得意げに答える。 「いったろカミやん。学生がこーいうイベントでテンションあげねーでどーするんだって。」 うさんくさい言葉だなと上条は思う。 この目の前の男は、学生である以前に魔術師だ。イギリス清教”必要悪の協会”に属する彼にはこれまでなんども魔術サイドの事件に巻き込まれていた。さすがに今回が魔術サイド云々の話につながるとは思っていないが、こいつが自分を学生だと推すのがなんか信用できない。 ふーんと適当に流すことにして上条はもう1人のクラスメイトのほうに顔を向ける。そこには、教室の窓から中をガン見して何かブツブツ言っている青髪ピアスがいた。 なに言ってんだと近づきかけた上条はパッとその足を止める。ブツブツ言ってる口から 「ショタと定義するには少し遠い・・・でも角度を変えて見方によっては・・・」 とか聞こえてきたからだ。 (・・・まえ言ってたのは勢いじゃなかったのかよ。) 半分引いて半分不憫な子を見るような、なんとも言えない表情で上条は青髪ピアスと距離をとる。そこへ 「なにやってるんですか~3人とも。もう授業はじめますよ~。」 と廊下の向こう側からパッと見小学生のような担任に声をかけられる。 周りの生徒も気付けばおらず、3人だけが廊下で立っていた。 と、いままでブツブツ言っていた青髪ピアスがくるっと声の方へ方向転換する。 「はーい。いやー、転校生に心揺さぶられもしたけどやっぱり小萌先生が一番やなぁ」 「当たり前だにゃー青髪ピアス。小萌先生もとい、ロリがたかだかすこし顔がいいくらいの転校生ふぜいに屈するわけがないんだにゃー。」 自身の変態性を惜しげもなく発揮するクラスメイト2人のあとに続くかたちで上条は教室に戻っていく。 なんか疲れが増した気がした上条は歩きながら決意する。 よし、残りの授業は全部睡眠にあてようと。 昼休み。 転校生の少年は正直閉口していた。 たしかに転校生というのは学生にとっては物珍しいのかもしれない。最初のうちは多少囲まれる事もあるだろうと覚悟もしていた。しかし3度の休憩時間を過ぎても周囲の人数が変わらない(いやむしろ若干増えている気もする。他のクラスの人間か?)のはどうだろうか。 「篠原くーん、食堂行こうよ。案内してあげる。」 クラスメイトの女子の1人が転校生の少年に話しかける。 篠原 圭。 男にしては長めの少し茶色がかった髪をもち、高校生にしては若干幼いが整った顔をしている。あまり高くない身長も手伝って容姿は少年という表現がしっくりくる。 その転校生の少年はクラスメイトの提案に対して鞄から取り出した箱を掲げる。 「ありがとう、でも今日は弁当持たされてるから」 「じゃあ一緒に食べよう。私も今日お弁当なんだ。」 すべて言い切る前に、話しかけられた子とは他の女子から割り込まれる。さらにはこっちから何か言う前に自分の机に他の机が会議でもする様に合わせられていく。 「・・・うざ」 「えー、何か言ったー?」 見ると、最初に食堂に誘ってきた女子までもがちゃっかり自分の机を合わせていた。 「いや、何も。」 (めんどくせーな、そろそろほっとけってんだ。いいかげん察しろよボケどもが。) 嫌味なくらいの爽やかな笑顔を顔に貼り付けて、その笑顔には似つかわしくないドス黒い暴言を篠原は誰にも聞こえないような小声で呟いた。 どっかでボロは出るんだろうがわざわざ転校初日に地を出してワル目立ちするのも面倒くさいなと考えていた篠原は、とりあえず当たり障りのない真面目な優等生を演じることで目立たないようにしている。 結局その当初の目的は彼が登校するとき、やたら高そうな黒塗りの送迎車によって簡単にぶっ壊れてしまったのだが。 予想はついていた。見るからに平均的なこんな学校でのまるで執事か何かのような黒スーツと高級車のコンボ。どー考えても目立つなというほうが無理である。 だから送り迎えなんざいらなかったんだと篠原は更に毒づいた。とはいえその容姿も目立つのに少なからず一役買っていたのだが彼はそれには気付いていない。 クラスメイトをかわすのを諦め、弁当箱の包みを解いていく。窓の外では、相変わらずディスプレイのついた飛行船が空を漂っていた。 昼下がり。 インデックスはベッドの上でごろごろと転がっていた。 昼ご飯はまいかが朝ご飯と一緒に作っておいてくれたものがあった。足りなければとうまがコンビニで買ってきたパンが台所にしまってある。すこしスフィンクスと昼寝をした後、最近はまっている再放送のアニメも見終わった。 要するに、彼女は暇を持て余していた。 「うー。暇なんだよ暇なんだよー。スフィンクスはかまってくれないし。」 三毛猫は床の窓側で日向ぼっこを満悦している。んー、良かったら一緒にどうですかいとでも言うようにゴロゴロと喉を鳴らす。 アニメの後でつけっぱなしになったテレビは学園都市のおでかけスポットを紹介する番組が流れていた。何気なくそちらに目を向けたインデックスの目がカッと見開かれる。 それは最近人気のたこ焼き、それも中身が6種類の6色たこ焼きなるものであった。 テレビのなかでややおおげさに紹介しているキャスターを見ながらその背後の景色をチェックしてインデックスはムクッと起き上がった。 ・・・この景色は見覚えがある、たしかとうまの学校のすぐ近くにあったはずだ。 「とうまを迎えに行かなくちゃ。これは決して六色たこ焼きが美味しそうだとかちょっと行って食べてみたいだとかそういうことではなくて、あくまで朝疲れた顔で出ていったとうまをたまには労わってあげようという慈悲の心なんだよ。」 誰に向けたわけでもない言い訳をすらすらと言いあげた後、シスターはスフィンクスをかかえて玄関に向かう。 と、その途中でそういえばといった感じで振り返り、スフィンクスを一旦おいて机の上に放置されていた携帯電話を手に取った。 出かけるときは持っておけと家主に渡されたものだが、当の渡された本人はこの文明機器の使い方がいまだに理解しきれていない。だがもしわからなくなったらその辺の誰かを捕まえて代わりに使ってもらえばいい。 そんなことを考えながら足元の三毛猫を促して再び玄関に向かう。 きらきらと表情を輝かせながら軽いスキップで歩く猫を抱えたシスターを横切る通りすがりの人が見たならば、おそらく遊園地にでも遊びに行く子供のように見えただろう。 学校の終わる少し前を見計らってリアは学校へ向かっていた。 用件は自分勝手な幼馴染の出迎えである。 朝の送迎車のなかでそいつの直々のご指名によって、いやおうなしにこの仕事を任命されたからだ。 「なんでわたしが・・・。」 ぶつぶつと小言を言いながら不機嫌そうな顔をした黒スーツの少女が道を行く。 思えばこの幼馴染には昔から振り回されていた気がする。例えば、出会った5歳の春には引っ張られていった山の中にそのまま置いていかれた。(そのあと母親にこっぴどく叱られてはいたが)6歳の夏には近所の駅に連れてこられて線路に勝手に侵入し、その共犯として駅長らしき人に散々怒鳴られた。(あとで聞いた話では、その日のダイヤが1,2本ずれたとか) その後しばらくして引っ越していったのだが、半年ほど前に再会したときにはあの眼鏡の初老の男を先頭にぞろぞろと黒スーツを取り巻きに従えていた。それについて問いただしているうちに眼鏡になし崩し的に黒スーツの一員とされ、現在に至る。 そして年月は無情に過ぎ去っていたようで、再会した少年は昔多少はあった愛嬌は消え失せ、周りを振り回す身勝手さは増していた。さらに無愛想にもなっていてかつて引っ越していった後の話を聞いても別にの一言で流される始末である。 あのアグレッシブさはどこ行ったんだと思いきや、初対面の人間にとてもにこやかな好青年(少年?)を演じたり、他の黒スーツと陰でコソコソ何かやってたりという面を見せたりもする。 そのくせこういった雑用にはしっかり自分を指名してくる辺り、昔よりタチ悪くなってんじゃねーかあの野郎といった感想を持たざるをえない。 要するに、自分はあいつにぞんざいな扱いのおもちゃにされているのだ。 ぐるぐると考えを巡らすうちそんな結論に行き着いたリアは沸々と怒りがこみ上げてくる。 これを晴らすにはやはり当人にぶつけさせてもらうのが一番だろうとこぶしを握って物騒な決意で口元を不適に緩める。 とそのとき、目の前を一匹の三毛猫が横切りかけて自分の足元に立ち止まる。なーと鳴いてこちらに首を擦り付けてくるこの猫には首輪がついていない。だが妙に懐っこいあたり飼い猫か、と適当に推測しつつそれを抱えあげる。 「スフィンクスー?どこ行ったのスフィンクスー」 すぐにそんな声が聞こえて真っ白なものが猫が出てきた場所から飛び出してくる。 シスターだ、とリアはすぐ理解した。彼女の出身であるイギリスではその国教の関係で街中のシスターは珍しいものではない。それは見覚えのあるつくりの服だった。だがよく見るとその格好はところどころ安全ピンで留めてあるのみというなかなかにパンクな格好である。 そのシスターはふと立ち止まりこちらを、いや正確には腕の中の三毛猫の方を見ていた。 「スフィンクス」 「・・・あ、この子の飼い主さん?」 スフィンクスという単語が猫の名前だと理解するのに少し時間を要した後、猫をシスターに差し出す。 「うん、スフィンクスっていうんだよ。」 リアの推定を肯定しつつ、純白シスターはその猫を受け取る。 「そう。この辺りたまに車が通ってるから放さないよう気をつけてね」 あまり広くない道路を見渡してリアは適当に会話を続ける。 「違うもん、スフィンクスが勝手に走ってっちゃっただけなんだよ。」 そんな会話を続けながら、ふと違和感を覚える。 学園都市のシスター。 科学の最先端を行くこの街において宗教の必要性があるのかと疑問に思ってしまう。いや多少はそれを求めるものもいるのかもしれないが、それでもシスターがわざわざくるほどの人数がいるとも思えない。 きょとんとしているシスターの横で、んーと軽く考え込んでる彼女の背後に一つの足音が止まる。 「うわ、なにしてんだお前。」 背後からの聞き覚えのある声にリアは思考を中断する。 振り返った先に立っているのはやはり見覚えのある顔だった。少し長めの茶色がかった髪をもつ童顔の少年。今朝、思いつきとわがままで彼女の手間を増やした張本人である。 その当人のそれを忘れているかのような口調にスーツの少女は眉間にしわを寄せる。 「あーんーたーが今朝私に来いっつったからでしょうが!何なのまさかそれすら覚えてないほどあんたの頭はもうろくしちゃってる訳!?」 「癇癪起こすなってうっせーな。まさかホントに来るとは思ってなかったんだよ。」 溜まったストレスを発散するかのように怒鳴り散らす目の前の幼馴染を篠原はあくびをしながら適当に話を受け流す。 「行かないとあのメガネに小言聞かされるのは私なの!大体何!?あんたまだ学校終わる時間じゃないでしょ。」 「あー、ふけた。」 さも当然とでも言うような言い方にリアは逆にあっけにとられる。 「体調不良ってことで昼からサボったんだよ。で、保健室で寝てたけど暇だったんで帰ってきた。まー書置きしてきたし大丈夫だろ。」 そしたらお前と出くわすしなーとボソッと付け加えた言葉をリアは聞き逃さない。 「あ、あんた私のことかわそうとしてたわね!」 ぎゃーぎゃーと口喧嘩(片方は相手にしてないようだが)をする二人の横でポツンと置いてかれているシスター。 その事にようやく気付いたリアが口撃を中断させて慌ててそっちに話しかける。 「あっ、ごめんなさい。見苦しいものを見せちゃって。」 愛想笑いを必死で浮かべる彼女の横で見苦しいのはお前だけだけどなと少年は小声で付け加え、それを聞いた少女はまた彼を睨みつける。 「そういや誰だそいつ?お前学園都市に知り合いなんかいたのか?」 話を変えた篠原の言葉にそういえば、と視線をシスターの方へと向ける。 ようやく会話の輪の中に入れたシスターだが特に物怖じすることなく視線を返した。 「私はインデックスっていうんだよ。」 「インデックス・・・?」 名前としてはまず出てこないような単語におもわず反復してしまったリアだったが、すぐにそれについて考えることをやめた。 目の前の少女といいその猫といい、おそらく学園都市では名前についてこちらが理解できないルールでもあるのだろうとかなり投げやりな結論で自分の中で流すことにしたのだ。 と、ふと気がつくとそこにいた篠原の姿がない。少し視線をずらすと少年はもう歩き始めていた。 「ちょっ、あんた自分から会話振っといて何勝手に先帰ってんのよ。第一、そっちは方向違うでしょ!」 すたすたと先を行く身勝手な幼馴染に慌てて声をかける。その一方で、少年は見つかったこと に若干肩をビクッとさせて 「腹減ったからこの先のたこ焼屋よって帰るわ。先帰ってサイモンには適当に言っといて。」 リーダー格の初老のメガネを思い浮かべ、リアはうげぇと声をあげる。 「はぁ、何言ってんのよ、それであのおっさんが納得する訳ないでしょ。大体あんたは監視しとかないとすぐどっか行っちゃ」 ふとスーツの裾が引っ張られていることに気付き、リアは言葉を途切れさせる。その裾の方へ振り返ると、変な名前のシスターが目をらんらんと輝かせてそこに立っていた。 「六色たこ焼きだね!あのたこ焼きのところへ行くんだね!」 六色?と頭の上にはてなを浮かべるリアに変わって、少年がその会話に応答する。 「あーそれだそれ。さっきテレビでやってた。」 「・・・ちょっと、なんであんたはテレビなんか見れてんのよ?」 「ケータイだよ。保健室で暇だから見てた。」 あんた実はそれが食べたくなったからサボったんじゃないのかと小声でつぶやく。その横にはその目を更に輝かせて、さっきよりも強く裾を引っ張るシスターがいる。 「私も行く!」 もはやそれしか見えてないようなシスターの突然の提案に戸惑う黒スーツの少女。 そんなやりとりを背後に聞きながら、篠原は軽く振り返り純白シスターを確認する。 なるほど、あれがサイモンの警戒する二人の片割れ、禁書目録か。 放課後。 多少の妨害を受けつつも、しっかり昼の授業で体力を回復した上条当麻は家路についていた。 とりあえず家に帰ってかばんを置いて、近くのデパートで当面の食料の確保や足りなくなった日用品などの補充とこれからの計画を立てる。 そして、それと同時にデパートに行くのにいかにインデックスを振り切るかを考える。むしろこっちをメインに考えているかもしれない。もしあのシスターさんを連れていったら、買い物かごに何を入れられるかわかったものではない。ならば直接買いに行けばよかったのではとも思うが、今日は買い込むものが多いため余分な荷物はできる限り持たずにおきたい。よって、一旦家に帰るしかないないという結論に至ったのである。 「ただいまー・・・」 よその家にお邪魔する、というより泥棒に入るようなしぐさで我が家のドアを開ける上条。作戦は、留守番しているインデックスに気付かれる前にかばんだけ置いて外にダッシュである。 だが、どうにも家の中は誰の気配も感じない。もしかして寝てんのかとおそるおそる上条は居間を覗いたがやはり誰もいなかった。 「ったく、インデックスのやつ、鍵もかけずに出て行きやがって。」 警戒対象が家にいなかったことは好都合なのだが、居候の無用心さにいささかあきれる。 ふと机をみると、いつも置いてある場所にシスター用の携帯がない。どうやらこれは忘れずに持って出歩いているようだった。もっとも、それを彼女が最低限正しく使いこなせるかどうかは疑問の残るところではあるが。 とりあえず居場所ぐらいは確認しておくために上条は自分の携帯を手に取り、インデックスの番号を引っ張り出した。20コールいっぱいに使ってようやく出たことに上条は驚いた。ただ、彼が驚いたのはコール数ではなくその電話が出られたことであるが。 『え、えっともしもし』 だがどうもおかしい。どうも電話の向こう側は上条の知るシスターではないらしい。おまけにこの通話相手は少しパニクっているような気がする。 なんとなく状況が予想できつつあるものの、一応問いかける。 「えーと・・・どちらさまでしょうか。」 『あ、私はリアっていいま(おーい、とうまー)』 通話相手の声に混じって明らかにインデックスの声がする。状況を確信した上条は電話を続ける。 「もしかして、そこのシスターに携帯押し付けられて代わりに電話に出る羽目になったとか。」 『はい、大体そんな感じです。』 「・・・シスターに代わってもらっていいですか?」 はい、と少しの間をおいて通話相手がシスターへとかわる。 『もしもしとうまー』 「お前なー、この間携帯の最低限の使い方は一通り言ったはずだと思うんだけど。」 『んー・・・、忘れちゃった。』 「嘘付け完全記憶能力者!お前実はあの時聞いてなかったんだろ!」 『だってわかんなかったんだもん。』 「ったく、まーそれはいいとしてお前さっきの人に迷惑かけてねーだろーなー。」 『うーん・・・たこ焼き奢ってもらったけど迷惑はかけてないよ。』 「おもいっきりかけてんじゃねーか!てゆーかお金持ってないだろお前は!」 上条はインデックスにお金を持たせた覚えはない。そして、たこ焼き屋についたときお金がないことに気付いて意気消沈するシスターはその雰囲気で半ば強制的に奢らせている。 このままインデックスを放置しておくと犠牲者が増えると上条は思う。 「はぁー、お前今どこにいるんだよ。」 『えーとね、今はゲームセンターにむかってる。』 場所の詳細を少し苦労して聞きだした上条は携帯を閉じ、計画が最初から大きく逸れて落胆する。そういえば今日は朝からあのシスターに振り回されている(今に始まったことではないが)。 とりあえず学生寮から出た上条はデパートとは逆の方向へと歩き始めた。
https://w.atwiki.jp/jpops/pages/9237.html
threadyarnをお気に入りに追加 threadyarnのリンク #bf Amazon.co.jp ウィジェット threadyarnの報道 gnewプラグインエラー「threadyarn」は見つからないか、接続エラーです。 threadyarnとは threadyarnの53%は株で出来ています。threadyarnの23%はビタミンで出来ています。threadyarnの9%は赤い何かで出来ています。threadyarnの8%は魂の炎で出来ています。threadyarnの6%は月の光で出来ています。threadyarnの1%は呪詛で出来ています。 threadyarn@ウィキペディア threadyarn Amazon.co.jp ウィジェット 掲示板 名前(HN) カキコミ すべてのコメントを見る ページ先頭へ threadyarn このページについて このページはthreadyarnのインターネット上の情報を集めたリンク集のようなものです。ブックマークしておけば、日々更新されるthreadyarnに関連する最新情報にアクセスすることができます。 情報収集はプログラムで行っているため、名前が同じであるが異なるカテゴリーの情報が掲載される場合があります。ご了承ください。 リンク先の内容を保証するものではありません。ご自身の責任でクリックしてください。
https://w.atwiki.jp/ukokuten/pages/28.html
(数字)K/M/B 千の位。1000=1K。 「M」は100万の位。1,000,000=1M。 「B」は10億の位。1,000,000,000=1B。 「B」を使うことはめったにありませんが、「K」や「M」はよく使われています。